package dcli;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

/**
 * Universidad Simón Bolívar
 * Curso de Redes I - Taller
 * Profesor: Ricardo Gonzalez
 * Trimestre Enero-Marzo 2011
 *
 * Proyecto 2 RD
 *
 * @author Grupo 9
 * @author Richard Simoes Ferreira
 * @author Ricardo Tocco
 *
 * @version 1.0
 */

public class Promtp {

 /**
 *  Estructura que implementa la consola del programa dcli
 */
    private ControlDcli control;

    /**
     * Constructor de la clase Promtp
     * @param c Estructura de control del programa dcli
     */
    public Promtp (ControlDcli c){
        this.control = c;
    }

    /**
     * Código que implementa la consola de dcli
     */
    public void run(){

        boolean fin = false;
        ErrorHandler errorH = new ErrorHandler();
        
        //Iniciar la sesion
        if (!control.getSesionIniciada()){
            control.iniciarSesion();
        }

        while (!fin){
            BufferedReader teclado;
            String buf;
            String argumentos[];
            StringTokenizer tokens;

            teclado = new  BufferedReader(new InputStreamReader(System.in));
            System.out.print("DCLI$>");
            String comando = null;

            try {
                if ((buf = teclado.readLine()) != null) {

                    if (!buf.equals("")) {
                        argumentos = buf.split("\\+");
                        tokens = new StringTokenizer(argumentos[0]);
                        comando = tokens.nextToken();

                        if (comando.equals("ldir")) {
                            //Mostrará en pantalla los nombres y tamaños de cada
                            //uno de los archivos locales al programa dcli,
                            //es decir, los archivos que estén contenidos en el
                            //directorio <ldirectorio>
                            if (!tokens.hasMoreElements())
                                control.ldir();
                            else
                                errorH.errorComandoDesconocido(comando);

                        } else if (comando.equals("rdir")) {
                            //Mostrará en pantalla los nombres y tamaños de 
                            //cada uno de los archivos locales que contiene el
                            //programa drep, al que esta conectado el programa
                            //dcli, es decir, de los archivos que estén contenidos
                            //en el directorio <rdirectorio> del drep
                            if (tokens.hasMoreElements())
                                errorH.errorComandoDesconocido(comando);
                            else
                                control.rdir();

                        } else if (comando.equals("tuser")) {
                            //Mostrará en pantalla una lista con los nombres de
                            //todos los usuarios activos en el sistema, es
                            //decir, de todos los usuarios que están en ese
                            //momento conectados a algún drep del sistema, a
                            //través de un programa dcli.
                            if (tokens.hasMoreElements())
                                errorH.errorComandoDesconocido(comando);
                            else
                                control.tuser();

                        } else if (comando.equals("nrep")) {
                            //Indicará en pantalla el número de todos los 
                            //programas drep que están activos en el sistema
                            if (tokens.hasMoreElements())
                                errorH.errorComandoDesconocido(comando);
                            else
                                control.nrep();

                        } else if (comando.equals("sube")) {
                            //Subirá a su programa drep correspondiente el 
                            //contenido del archivo de nombre tokens.nextToken()
                            //, al finalizar la ejecución del comando, una copia
                            //del archivo con el mismo nombre empleado en la
                            //llamada, debe estar bajo el directorio <rdirectorio>
                            //del programa drep correspondiente
                            if(tokens.hasMoreElements()){
                                String s = "";
                                while (tokens.hasMoreElements())
                                    s += tokens.nextToken()+" ";
                                control.sube(s.substring(0, s.length()-1));
                            } else {
                                errorH.errorComandoDesconocido(comando);
                            }

                        } else if (comando.equals("baja")) {
                            //Bajará el contenido del archivo de nombre 
                            //tokens.nextToken() desde el programa drep al
                            //directorio local <ldirectorio> del programa dcli.
                            //Al finalizar la ejecución del comando, una copia
                            //del archivo con el mismo nombre empleado debe
                            //estar bajo el directorio <ldirectorio> del
                            //programa dcli
                            if(tokens.hasMoreElements()){
                                String s = "";
                                while (tokens.hasMoreElements())
                                    s += tokens.nextToken()+" ";
                                control.baja(s.substring(0, s.length()-1));
                            } else {
                                errorH.errorComandoDesconocido(comando);
                            }

                        } else if (comando.equals("cat")) {
                            //Listará por pantalla el contenido del archivo 
                            //local tokens.nextToken(), el cual debe estar
                            //en el directorio <ldirectorio> del programa dcli
                            if(tokens.hasMoreElements()){
                                String s = "";
                                while (tokens.hasMoreElements())
                                    s += tokens.nextToken()+" ";
                                control.cat(s.substring(0, s.length()-1));
                            } else {
                                errorH.errorComandoDesconocido(comando);
                            }

                        } else if (comando.equals("help") ||
                                comando.equals("--help")) {
                            ErrorHandler.imprimirAyudaConsola();

                        } else if (comando.equals("q")) {
                            //Terminar el cliente
                            int result;
                            System.out.println("Terminando dcli...");
                            result = control.cerrarSesion();
                            if (result==0){
                                fin = true;
                            }

                        } else {
                            errorH.errorComandoDesconocido(comando);
                        }
                    }//fin if not ""
                } else {
                   //Nada
                }//fin if not null
  
            } catch (IOException ex) {
                errorH.errorLecturaConsola(null, control);
            }
        } // Fin While
    }//Fin run

    /**
     * Ejecuta una entrada correspondiente a un comando
     * @param entrada   Comando de la instrucción que desea ejecutar el cliente
     * @return          true si el comando ha ejecutado un "q" o finalizar y
     *                  false en cualquier otro caso
     */
    public boolean ejecutar_archivo (String entrada){

        ErrorHandler errorH = new ErrorHandler();
        //Iniciar la sesion
        if (!control.getSesionIniciada()){
            control.iniciarSesion();
        }

        String argumentos[];
        StringTokenizer tokens;
        String comando = null;

        if (entrada != null) {

            argumentos = entrada.split("\\+");
            tokens = new StringTokenizer(argumentos[0]);
            comando = tokens.nextToken();

            if (comando.equals("ldir")){
                //Mostrará en pantalla los nombres y tamaños de cada uno
                //de los archivos locales al programa dcli, es decir, los
                //archivos que estén contenidos en el directorio <ldirectorio>
                control.ldir();
            } else if (comando.equals("rdir")) {
                //Mostrará en pantalla los nombres y tamaños de cada uno de
                //los archivos locales que contiene el programa drep, al que
                //esta conectado el programa dcli, es decir, de los archivos
                //que estén contenidos en el directorio <rdirectorio> del drep
                control.rdir();
            } else if (comando.equals("tuser")){
                //Mostrará en pantalla una lista con los nombres de todos
                //los usuarios activos en el sistema, es decir, de todos los
                //usuarios que están en ese momento conectados a algún drep
                //del sistema, a través de un programa dcli.
                control.tuser();
            } else if (comando.equals("nrep")){
                //Indicará en pantalla el número de todos los programas drep
                //que están activos en el sistema
                control.nrep();
            } else if (comando.equals("sube")){
                //Subirá a su programa drep correspondiente el contenido del
                //archivo de nombre tokens.nextToken(), al finalizar la
                //ejecución del comando, una copia del archivo con el mismo
                //nombre empleado en la llamada, debe estar bajo el directorio
                //<rdirectorio> del programa drep correspondiente
                if(tokens.hasMoreElements()){
                        control.sube(tokens.nextToken());
                    } else {
                        errorH.errorComandoDesconocidoArch(comando);
                    }

            } else if (comando.equals("baja")){
                //Bajará el contenido del archivo de nombre tokens.nextToken()
                //desde el programa drep al directorio local <ldirectorio> del
                //programa dcli. Al finalizar la ejecución del comando, una
                //copia del archivo con el mismo nombre empleado debe estar bajo
                //el directorio <ldirectorio> del programa dcli
                if(tokens.hasMoreElements()){
                        control.baja(tokens.nextToken());
                    } else {
                        errorH.errorComandoDesconocidoArch(comando);
                    }

            } else if (comando.equals("cat")){
                //Listará por pantalla el contenido del archivo local
                //tokens.nextToken(), el cual debe estar en el directorio
                //<ldirectorio> del programa dcli
                if (tokens.hasMoreElements()){
                        control.cat(tokens.nextToken());
                    } else {
                        errorH.errorComandoDesconocido(comando);
                    }

            } else if (comando.equals("q")){
                //Terminar el cliente
                System.out.println("Terminando dcli...");
                control.cerrarSesion();
                return true;
            }

        } else {
              //Nada
        }//if NULL

        return false;
    }

}
